# -*- coding: utf-8 -*-
# Author: xiantingDeng
# Email: dengxianting@shxgroup.net
# Time: 14:49

#
# import datetime
# import re
# from common.utils.file_util import get_log_dir
# import os
# import sys
# import logging
#
#
# try:
#     import codecs
# except ImportError:
#     codecs = None
#
#
# def loggerDefine(platform, log_name):
#     base_dir = get_log_dir(__name__)
#
#     info_dir_path = base_dir + "\\info\\{}".format(platform)
#     error_dir_path = base_dir + "\\error\\{}".format(platform)
#
#     # 判断响应的文件是否存在
#     if not os.path.exists(info_dir_path):
#         os.makedirs(info_dir_path)
#     info_dir = os.path.join(info_dir_path, log_name)
#
#     if not os.path.exists(error_dir_path):
#         os.makedirs(error_dir_path)
#     error_dir = os.path.join(error_dir_path, log_name)
#
#     # 返回一个logger对象，如果没有指定名字将返回root logger
#     log = logging.getLogger('test')
#
#     # 定义日志输出格式
#     formattler = '%(asctime)s-%(processName)s-%(threadName)s-%(levelname)s-%(filename)s:%(lineno)d-%(funcName)s-%(message)s'
#     fmt = logging.Formatter(formattler)
#
#     # 设置日志控制台输出
#     stream_handler = logging.StreamHandler(sys.stdout)
#     stream_handler.setLevel(logging.INFO)
#
#     # 设置控制台文件输出
#     log_handler_info = MultiprocessHandler(info_dir)
#     log_handler_err = MultiprocessHandler(error_dir)
#
#     # 设置日志输出格式：
#     stream_handler.setFormatter(fmt)
#     log_handler_info.setFormatter(fmt)
#     log_handler_err.setFormatter(fmt)
#
#     # 设置过滤条件
#     info_filter = logging.Filter()
#     info_filter.filter = lambda record: record.levelno < logging.WARNING  # 设置过滤等级
#     err_filter = logging.Filter()
#     err_filter.filter = lambda record: record.levelno >= logging.WARNING
#
#     # 对文件输出日志添加过滤条件
#     log_handler_info.addFilter(info_filter)
#     log_handler_err.addFilter(err_filter)
#
#     # 对logger增加handler日志处理器
#     log.addHandler(log_handler_info)
#     log.addHandler(log_handler_err)
#     log.addHandler(stream_handler)
#
#     log.setLevel("INFO")
#     return log
#
#
# class MultiprocessHandler(logging.FileHandler):
#     """支持多进程的TimedRotatingFileHandler"""
#
#     def __init__(self, filename, when='D', backupCount=7, encoding="utf-8", delay=False):
#         """
#         filename 日志文件名,when 时间间隔的单位,backupCount 保留文件个数
#         delay 是否开启 OutSteam缓存
#         True 表示开启缓存，OutStream输出到缓存，待缓存区满后，刷新缓存区，并输出缓存数据到文件。
#         False表示不缓存，OutStrea直接输出到文件
#         """
#         self.prefix = filename
#         self.backupCount = backupCount
#         self.when = when.upper()
#         # 正则匹配 年-月-日
#         # 正则写到这里就对了
#         self.extMath = r"\d{4}-\d{2}-\d{2}"
#
#         # S 每秒建立一个新文件
#         # M 每分钟建立一个新文件
#         # H 每天建立一个新文件
#         # D 每天建立一个新文件
#         self.when_dict = {
#             'S': "%Y-%m-%d-%H-%M-%S",
#             'M': "%Y-%m-%d-%H-%M",
#             'H': "%Y-%m-%d-%H",
#             'D': "%Y-%m-%d"
#         }
#         # 日志文件日期后缀
#         self.suffix = self.when_dict.get(when)
#         # 源码中self.extMath写在这里
#         # 这个正则匹配不应该写到这里，不然非D模式下 会造成 self.extMath属性不存在的问题
#         # 不管是什么模式都是按照这个正则来搜索日志文件的。
#         # if self.when == 'D':
#         #    正则匹配 年-月-日
#         #    self.extMath = r"^\d{4}-\d{2}-\d{2}"
#         if not self.suffix:
#             raise ValueError(u"指定的日期间隔单位无效: %s" % self.when)
#         # 拼接文件路径 格式化字符串
#         self.filefmt = os.path.join(os.getcwd(), "%s.%s" % (self.prefix, self.suffix))
#         a = "%s.%s" % (self.prefix, self.suffix)
#         # 使用当前时间，格式化文件格式化字符串
#         self.filePath = datetime.datetime.now().strftime(self.filefmt)
#         # 获得文件夹路径
#         _dir = os.path.dirname(self.filefmt)
#         try:
#             # 如果日志文件夹不存在，则创建文件夹
#             if not os.path.exists(_dir):
#                 os.makedirs(_dir)
#         except Exception:
#             print("创建文件夹失败")
#             print("文件夹路径：" + self.filePath)
#             pass
#         if codecs is None:
#             encoding = None
#             # 调用FileHandler
#         logging.FileHandler.__init__(self, self.filePath, 'a+', encoding, delay)
#
#     def shouldChangeFileToWrite(self):
#         """更改日志写入目的写入文件
#         return True 表示已更改，False 表示未更改"""
#         # 以当前时间获得新日志文件路径
#         _filePath = datetime.datetime.now().strftime(self.filefmt)
#         # 新日志文件日期 不等于 旧日志文件日期，则表示 已经到了日志切分的时候
#         #   更换日志写入目的为新日志文件。
#         # 例如 按 天 （D）来切分日志
#         #   当前新日志日期等于旧日志日期，则表示在同一天内，还不到日志切分的时候
#         #   当前新日志日期不等于旧日志日期，则表示不在
#         # 同一天内，进行日志切分，将日志内容写入新日志内。
#         if _filePath != self.filePath:
#             self.filePath = _filePath
#             return True
#         return False
#
#     def doChangeFile(self):
#         """输出信息到日志文件，并删除多于保留个数的所有日志文件"""
#         # 日志文件的绝对路径
#         self.baseFilename = os.path.abspath(self.filePath)
#         # stream == OutStream
#         # stream is not None 表示 OutStream中还有未输出完的缓存数据
#         if self.stream:
#             # self.stream.flush()
#             self.stream.close()
#             self.stream = None
#         # delay 为False 表示 不OutStream不缓存数据 直接输出
#         #   所有，只需要关闭OutStream即可
#         if not self.delay:
#             # self.stream.close()
#             self.stream = self._open()
#
#         # 删除多于保留个数的所有日志文件
#         if self.backupCount > 0:
#             for s in self.getFilesToDelete():
#                 # print s
#                 os.remove(s)
#
#     def getFilesToDelete(self):
#         """获得过期需要删除的日志文件"""
#         # 分离出日志文件夹绝对路径
#         # split返回一个元组（absFilePath,fileName)
#         # 例如：split('I:\ScripPython\char4\mybook\util\logs\mylog.2017-03-19）
#         # 返回（I:\ScripPython\char4\mybook\util\logs， mylog.2017-03-19）
#         # _ 表示占位符，没什么实际意义，
#         dirName, _ = os.path.split(self.baseFilename)
#         fileNames = os.listdir(dirName)
#         result = []
#         # self.prefix 为日志文件名 列如：mylog.2017-03-19 中的 mylog
#         # 加上 点号 . 方便获取点号后面的日期
#         prefix = self.prefix
#         prefix = _.rsplit(".", 1)[0] + "."
#         plen = len(prefix)
#         for fileName in fileNames:
#             if fileName[:plen] == prefix:
#                 # 日期后缀 mylog.2017-03-19 中的 2017-03-19
#                 suffix = fileName[plen:]
#                 # 匹配符合规则的日志文件，添加到result列表中
#                 if re.compile(self.extMath).match(suffix):
#                     result.append(os.path.join(dirName, fileName))
#         result.sort()
#
#         # 返回  待删除的日志文件
#         #   多于 保留文件个数 backupCount的所有前面的日志文件。
#         if len(result) < self.backupCount:
#             result = []
#         else:
#             result = result[:len(result) - self.backupCount]
#         return result
#
#
#     def emit(self, record):
#         """发送一个日志记录
#         覆盖FileHandler中的emit方法，logging会自动调用此方法"""
#         try:
#             if self.shouldChangeFileToWrite():
#                 self.doChangeFile()
#             logging.FileHandler.emit(self, record)
#         except (KeyboardInterrupt, SystemExit):
#             raise
#         except:
#             self.handleError(record)
#
# if __name__ == '__main__':
#     logg = loggerDefine("youtube", "youtube.log")
#     logg.info("info")
#     logg.warning("warning")
#     logg.error("error")

from common.utils.file_util import get_log_name_dir

import os
import time
import logging
import inspect

handlers = {logging.NOTSET: get_log_name_dir("TNLOG-notset"),
            logging.DEBUG: get_log_name_dir("TNLOG-debug"),
            logging.INFO: get_log_name_dir("TNLOG-info"),
            logging.WARNING: get_log_name_dir("TNLOG-warning"),
            logging.ERROR: get_log_name_dir("TNLOG-error"),
            logging.CRITICAL: get_log_name_dir("TNLOG-critical")}

class TNLog(object):
    def printfNow(self):
        return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    def __init__(self, level=logging.NOTSET):
        self.__loggers = {}
        logLevels = handlers.keys()
        for level in logLevels:

            logger = logging.getLogger(str(level))
            path = os.path.abspath(handlers[level])
            handlers[level] = logging.FileHandler(path,encoding="utf-8")
            # 如果不指定level，获得的handler似乎是同一个handler?
            logger.addHandler(handlers[level])
            handlers[level] = logging.StreamHandler()
            logger.addHandler(handlers[level])
            logger.setLevel(level)
            self.__loggers.update({level: logger})

    def getLogMessage(self, level, message):
        frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[2]
        '''日志格式：[时间] [类型] [记录代码] 信息'''
        return "[%s] [%s] [%s - %s - %s] %s" % (self.printfNow(), level, filename, lineNo, functionName, message)

    def info(self, message):
        message = self.getLogMessage("info", message)
        self.__loggers[logging.INFO].info(message)

    def error(self, message):
        message = self.getLogMessage("error", message)
        self.__loggers[logging.ERROR].error(message)

    def warning(self, message):
        message = self.getLogMessage("warning", message)
        self.__loggers[logging.WARNING].warning(message)

    def debug(self, message):
        message = self.getLogMessage("debug", message)
        self.__loggers[logging.DEBUG].debug(message)

    def critical(self, message):
        message = self.getLogMessage("critical", message)
        self.__loggers[logging.CRITICAL].critical(message)

